<?php
final class Application
{
	Public static function run(){
		self::_init();//初始化框架
    set_error_handler(array(__CLASS__,'error'));//一般色错误个性化提示接管
    register_shutdown_function(array(__CLASS__,'fatal_error')); //接管致命性的错误
    self::_user_import();
    self::_set_url();//设置路由函数
    spl_autoload_register(array(__CLASS__,'_autoload'));//自动载入控制器类...__CLASS__表示当前访问的类名
    self::_create_dome();//创建Index（创建控制器）
    self::_create_index();//创建index模板文件
    self::_app_run();//实例化控制器，运行控制器里面的方法
	}
  
  public static function fatal_error(){
       if($e = error_get_last()){
        //var_dump($e);
           self::error($e['type'],$e['message'],$e['file'],$e['line']);
       }
  }

  public static function error($errno,$error,$file,$line){
       switch ($errno) {
          case E_ERROR:
          case E_PARSE:
          case E_COMPILE_ERROR:
          case E_USER_ERROR:
              $msg = $error . $file . "第{$line}行";
              P($msg);
              break;

          case E_STRICT:
          case E_USER_WARNING:
          case E_USER_NOTICE:
          default:
            if(DEBUG){
              include DATA_PATH . '/Tpl/notice.html';
            }
            break;
        } 

}
//通过get传值方式获取控制器 ,实例化控制器 调用方法
  private static function _app_run(){
       $c = isset($_GET[C('VAR_CONTROLLER')]) ? $_GET[C('VAR_CONTROLLER')] : 'Index';
       $a = isset($_GET[C('VAR_ACTION')]) ? $_GET[C('VAR_ACTION')] : 'index';
       define('CONTROLLER',$c); 
       define('ACTION',$a);  
       $c .= 'We';            
       if (class_exists($c)) {  //如果输入的类存在
         $obj = new $c();
         if(!method_exists($obj, $a)){ //如果方法不存在
              if(method_exists($obj, '__weEmpty')) { //如果在输入方法不存在的时候定义了__weEmpty方法，那就调用这个方法
                  $obj->__weEmpty(); 
              } else {
                 P($c . '控制器中' . $a . '不存在');
              }
         } else {
            $obj->$a(); 
         }
       } else {  //如果输入的控制器不存在， 就实例化 EmptyWe 控制器  来提示
          $obj = new EmptyWe();
          $obj->index(); 
       }
       
  }
/**
  *_create_dome 创建默认控制器
  *
  */
  private static function _create_dome(){
        $path = APP_CONTROLLER_PATH . '/IndexWe.php';
        $str = <<<str
<?php
class IndexWe extends WephpController
{
  public function index(){
     \$this->fetch();       
  }
} 
?>
str;
      is_file($path) || file_put_contents($path, $str);  //如果没有就创建Index控制器
  }

 /**
  *创建默认模板
  *
  */
  private static function _create_index(){
        $path = APP_INDEX_PATH . '/index.html';
        $html = <<<str
<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;}
body{ background: #fff; font-family: "微软雅黑"; color: #333;font-size:24px}
 h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; }
 p{ line-height: 1.8em; font-size: 36px } a,a:hover{color:blue;}
</style>
<div style="padding: 24px 48px;"> <h1>❀</h1><p>欢迎使用-<b>WePHP</b>☺</p><br/>作者：潇欢<br/>QQ：243484014</div>
str;
 
  is_file($path) || file_put_contents($path, $html);  //如果没有就创建Index控制器
 }


  /**
  *_autoload 拥有自动载入功能,是php自带函数
  *
  */
  private static function _autoload($className){      
         switch (true) {
           //判断是否是控制器类  控制器类的引入
           case strlen($className) > 2 && substr($className, -2) == 'We':
             $path = APP_CONTROLLER_PATH . '/' . $className . '.php';
             if(!is_file($path)){
                //用户在地址栏输入不存在的控制器时，就引入EmptyWe 控制器提示
                $emptyPath = APP_CONTROLLER_PATH . '/' . '/EmptyWe.php';
                if(is_file($emptyPath)){
                  include $emptyPath;
                  return;
                } else {
                  P($path . '控制器不存在');  
                }
             }                   
             include $path;
             break;
              //Model
          case strlen($className) > 5 && substr($className, -5) == 'Model':
            $path = COMMON_MODEL_PATH . '/' . $className . '.we.php';
            include $path;
        
            break;
            //工具类实现自动载入与类
           default:
             $path = TOOL_PATH . '/' .$className . '.we.php'; // 框架工具应用类 比如验证码类 图像处理类 
             if(!is_file($path)) P($path . '控制器不存在');                
             include $path;
             break;
         }
  }

  private static function _set_url(){
     // P($_SERVER); 打印当前脚本所在的url
    $path = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'];
    $path = str_replace('\\', '/', $path);
    define('__APP__', $path);//首页路径
    define('__ROOT__',dirname(__APP__));//项目路径不包含index.php
    //P(__ROOT__);
    define('__VIEW__', __ROOT__ . '/' . APP_NAME .  '/View' );// 模版路径
    //P(__VIEW__);
    define('__PUBLIC__', __VIEW__.  '/Public');
    
    define('__STATIC__',__ROOT__. '/Public' . '/static' );
    
  } 



	private static function _init(){ //初始化框架
		 //加载配置项
		 C(include CONFIG_PATH . '/config.php');
     
     //加载公共配置项
     $commonPath = COMMON_CONFIG_PATH . '/config.php';
   
    $commonConfig = <<<str
<?php
    //欢迎使用wephp框架，作者潇欢
    return array(
         //配置项 =>配置值
    

    );
   
?> 
str;
    is_file($commonPath) || file_put_contents($commonPath, $commonConfig);//如果没有 就创建配置文件
     
     C(include $commonPath);
     
     //加载用户配置项
		 $userPath = APP_CONFIG_PATH . '/config.php';
         
         $userConfig = <<<str
<?php
    //欢迎使用wephp框架，作者潇欢
    return array(
         //配置项 =>配置值
    

    );
   
?> 
str;
           
           is_file($userPath) || file_put_contents($userPath, $userConfig);//如果没有 就创建配置文件
           //加载用户的配置项
           C(include $userPath);
           
           // 设置默认时区
           date_default_timezone_set(C('DEFAULT_TIME_ZONG'));
	       
	       //是否开启session
	       C('SESSION_AUTO_START') && session_start();

	}

  private static function _user_import(){
       $fileFun = C('AUTO_LOAD_FILE');
       //P($fileFun);exit;
       if(is_array($fileFun) && !empty($fileFun)){
            foreach ($fileFun as $v) {
               require_once COMMON_LIB_PATH . '/' .$v;
            }
       }
  }

}
?>